package zdori;

public class J18_Oop4 {

	/**
	 * @param args
	 * 
	 * static
	 * 일반적으로 객체를 생성하려면
	 * 생성자를 사용해야 함
	 * 하지만 생성자 없이도 객체를 바로 사용할 수도 있음
	 * static 로 선언된 멤버 변수는 클래스명.멤버변수 형태로 사용
	 * static 로 선언된 메서드는 클래스명.메서드 형태로 사용
	 * static 로 선언된 멤버 변수를 클래스(공용) 변수라고 부르기도 함
	 * 이것과 유사하게 C에서는 전역변수라고 함
	 * 
	 * static 이 인스턴스 보다 초기화 시점(메인메서드가 호출되는 시점)이 빠르다
	 * static 으로 선언된 멤버변수는 main() 메서드가 호출되기 전에 먼저 메모리에 변수공간이 생성됨
	 * 반면에 객체는 main() 메서드가 호출되고 해당 클래스의 생성자가 호출되어야만 변수공간이 생성
	 * 
	 * oop 작성기법1
	 * 프로그램 작성시 클래스는 용도(값,처리)에 따라 최소 2개이상으로 나눠 작성하는 것을 추천
	 * 값만을 저장하는 클래스 : value object 클래스 
	 * 값을 받아서 처리만 하는 클래스 : service 클래스
	 * 
	 * 인수 전달 방식
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Rent r20131107001 = new Rent();
		r20131107001.rentNo = 351;	//대여번호
		r20131107001.bookNo = 8746;	//대여한 대상 번호
		r20131107001.memberNo = 68;	//대여한 사람 번호
		System.out.println(r20131107001.showRentInfo());
		
		//static 으로 선언된 클래스 사용
		StaticRent.rentNo = 654;
		StaticRent.bookNo = 12345678;
		StaticRent.memberNo = 5467;
		System.out.println(StaticRent.showRentInfo());
		
		
		//성적데이터 초기화
		Sungjuk sj = new Sungjuk();
		sj.kor = 32;
		sj.eng = 45;
		sj.mat = 55;
		sj.tot = sj.kor+sj.eng+sj.mat;
		sj.tot = sj.ShowTotal();
		
		//성적 데이터 초기화2
		SungjukVO sjvo = new SungjukVO(99,98,99);
		SungjukService sjsv = new SungjukService();
		sjvo.tot = sjsv.getTotal(sjvo.kor, sjvo.eng, sjvo.mat);
		
		//생성자를 쓰지 않고 메서드 호출
		sjvo.tot = SungjukService.getTotal2(sjvo.kor, sjvo.eng, sjvo.mat);
		System.out.println(sjvo.tot);
	}

}

class Rent{
	int rentNo;
	int bookNo;
	int memberNo;
	
	String showRentInfo(){
		String rentInfo = "대여번호 : "+rentNo+" 책번호 : "+bookNo+" 회원번호 : "+memberNo;
		return rentInfo;
	}
}

//객체 생성 없이 클래스 사용
class StaticRent{
	 static int rentNo;
	 static int bookNo;
	 static int memberNo;
	 String rentDate;	//static 으로 선언되지 않음
	
	 static String showRentInfo(){
		String rentInfo = "대여번호 : "+rentNo+" 책번호 : "+bookNo+" 회원번호 : "+memberNo;
		//System.out.println(rentDate);//오류발생
		//static 으로 선언된 메서드에서는 비 static 변수는 사용불가
		//하지만 rentDate 를 사용하고 싶다면?
		//StaticRent sr = new StaticRent();
		//System.out.println(sr.rentDate);
		return rentInfo;
	}
}

class Sungjuk{
	int kor;
	int eng;
	int mat;
	int tot;
	
	public Sungjuk() {
		// TODO Auto-generated constructor stub
	}
	
	public Sungjuk(int kor, int eng, int mat) {
		// TODO Auto-generated constructor stub
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}
	
	int ShowTotal(){
		return kor+eng+mat;
	}
}

//성적 클래스 : 성적에 관련된 데이터만 저장
//즉, 멤버변수만 존재하고 그것을 처리하는 메서드는 없음
class SungjukVO{
	String name;
	int kor;
	int eng;
	int mat;
	int tot;
	
	//생성자
	public SungjukVO() {
		// TODO Auto-generated constructor stub
	}
	
	public SungjukVO(int kor,int eng, int mat) {
		// TODO Auto-generated constructor stub
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}
}

//성적 데이터에 대한 총점, 평균, 학점등을 처리하는 클래스
class SungjukService{
	int getTotal(int kor,int eng, int mat){
		return kor+eng+mat;
	}
	
	static int getTotal2(int kor,int eng, int mat){
		return kor+eng+mat;
	}
}